import Request from "@/utils/request";
import { 
  env, 
  baseUrl, 
  tokenName, 
  reqType, 
  reqMethod, 
  reqEncrypt, 
  encryptSecretKey, 
  encryptRequestKey,
  reqLoading, 
  reqSync, 
  reqSyncType, 
  printRequestLogger,
  reqRetryNum, 
  reqRetryTime,
  successStatus,
  successCode,
  invalidCode,
} from "@/config";
import { getToken, removeToken } from "@/utils/auth";
import store from '@/store/index.js';

// 实例化请求对象
const http = new Request({
  secretKey: encryptSecretKey,      // 加密秘钥 
  requestKey: encryptRequestKey,    // 加密时服务器接收的名称
  // #ifndef APP-PLUS
  printLogger: printRequestLogger,  // 打印请求日志
  // #endif
});

// 设置响应成功判断
http.responseValidate = (response) =>{
  return response.statusCode === successStatus;
}

// 根据配置文件初始化请求全局配置
http.setConfig((config) => {
  return Object.assign({}, config, {
    baseUrl,
    method: reqMethod,
    loading: reqLoading,
    sync: reqSync,
    syncType: reqSyncType,
    encrypt: reqEncrypt,
    type: reqType,
    retryNum: reqRetryNum,
    retryTime: reqRetryTime,
  })
});


/* 请求拦截器 */
http.interceptor.request((config, cancel) => {
	
  // 每次发送请求若存在token，则在header头传递
  const token = getToken();
  if(token) config.header[tokenName] = token;

  return config;
});

/* 响应截器 */
http.interceptor.response(
  /* 成功回调函数 */
  (response) => {
    let res = response.data;

    // 请求成功
    if (res.code === successCode) {
      
      handlePageData(res);  // 处理分页数据
      
      return res;
    
    // 登录失效
    } else if (res.code === invalidCode) {
      logout();
      return Promise.reject({
        errMsg: '全局请求拦截器判断登录失效，当前状态码：' + res.code,
        response
      })
    
    // 请求失败
    } else {
      return Promise.reject({
        errMsg: '全局请求拦截器判断请求失败，信息如下：\n当前状态为：' + res.code + '，成功状态码为：' + successCode,
        response
      })
    }
			
  },
  /* 失败回调函数 */
  (error) => {

    // 状态码401登录失效
    if(error.statusCode == 401) {
      logout();
			console.log('%c登录失效！', 'color: red;')

    // 接口不存在
		} else if(error.statusCode == 404) {
      console.log('%c接口不存在！', 'color: red;')

    // 请求方法不允许
		} else if(error.statusCode == 405) {
      console.log('%c方法不允许！', 'color: red;')
      
    // 状态码500，服务器异常
		} else if(error.statusCode == 500) {
      console.log('%c服务器异常失效！', 'color: red;')
    
    // 其他状态处理
		} else {
			console.log('%c请求出错，状态码：' + (error.statusCode || '未发送成功'), 'color: red;');
		}

    return error;
  }
);


export default http;

/**
 * 登录失效处理，可用于退出登录调用
 */
export function logout () {
  store.commit('removeUserInfo');   // 清除用户信息
  removeToken();   // 清除token
}

/**
 * 处理分页数据
 * @param { Object } data 要处理的数据
 */
export function handlePageData(res) {
  if(res.data) {
    // if(res.data.splitPage) {
    //   let next = res.data.splitPage;
    //   res.count = next.totalCount;
    //   res.nextpage = next.pageIndex < Math.ceil(next.totalCount / next.nextPageNo) ? true : false;
    //   res.currentPage = next.pageIndex;
    //   res.data = res.data.list;
    // }
    // if(res.data.next) {
    //   res.nextpage = res.data.next == -1 ? false : true;
    // }
    res.count = res.data.count;
    res.nextpage = res.data.nextpage;
    res.currentPage = res.data.currentPage;
    if(res.data.list) res.data = res.data.list;
  }
}
